package by.dvrudenko.avtobaza.webapp.page.createOrder;


import java.util.List;

import javax.inject.Inject;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
import org.apache.wicket.bean.validation.PropertyValidator;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.SubmitLink;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.wicketstuff.gmap.api.GLatLng;
import org.wicketstuff.gmap.event.ClickListener;

import by.dvrudenko.avtobaza.datamodel.City;
import by.dvrudenko.avtobaza.datamodel.UserOrder;
import by.dvrudenko.avtobaza.services.CityService;
import by.dvrudenko.avtobaza.services.UserOrderService;
import by.dvrudenko.avtobaza.services.UserService;
import by.dvrudenko.avtobaza.webapp.page.BaseLayout;
import by.dvrudenko.avtobaza.webapp.page.home.HomePage;
import by.dvrudenko.avtobaza.webapp.utils.renderer.CityChoiseRenderer;

@AuthorizeInstantiation({ "ADMIN","DRIVER","USER" })
public class createOrderPage extends BaseLayout {
	
	private static final Logger LOGGER = LoggerFactory.getLogger(createOrderPage.class);	
	
	@Inject
	private CityService cityService;
	
	@Inject
	private UserService userService;
	
	@Inject
	private UserOrderService userOrderService;	
	
	final private UserOrder userOrder;
	
	// получаем список всех городов
	final private List<City> allCity = cityService.getAllCity();
		
	public createOrderPage(final UserOrder userOrder) {
		
		this.userOrder = userOrder;
			
		// создаем карту, на которой потом будет отмечать координаты
		final userOrderMap map = new userOrderMap("map");
		add(map);

		// форма создания заказа
		Form<UserOrder> formCreateOrder = new Form<UserOrder>("createOrderMenu", new CompoundPropertyModel<UserOrder>(userOrder));
		
		final TextField<Integer> cargoWidth = new TextField<Integer>("cargoWeight");
		cargoWidth.setLabel(new ResourceModel("p.home.createorder.cargoWeight"));
		cargoWidth.add(new PropertyValidator<Integer>());
		formCreateOrder.add(cargoWidth);
		
		final TextField<Integer> cargoVolume = new TextField<Integer>("cargoVolume");	
		cargoVolume.setLabel(new ResourceModel("p.home.createorder.cargoVolume"));
		cargoVolume.add(new PropertyValidator<Integer>());
		formCreateOrder.add(cargoVolume);
		
		final TextArea<String> cargoDescr = new TextArea<String>("cargoDescription");	
		cargoDescr.setLabel(new ResourceModel("p.home.createorder.cargoDescr"));
		cargoDescr.add(new PropertyValidator<String>());
		formCreateOrder.add(cargoDescr);
		
		// комбик с городами
		final Model<City> selectedCityBeg = new Model<City>();
		final DropDownChoice<City> dropDownChoiceBeginningCity = new DropDownChoice<City>("cargoBeginningCity",selectedCityBeg, allCity, CityChoiseRenderer.INSTANCE);
		if (userOrder.getCargoBeginningCity()!=null){
			dropDownChoiceBeginningCity.setDefaultModelObject(userOrder.getCargoBeginningCity());
		}
		dropDownChoiceBeginningCity.setRequired(true);
		dropDownChoiceBeginningCity.add(new AjaxFormComponentUpdatingBehavior("change")
	        {
				
				@Override
				protected void onUpdate(AjaxRequestTarget target) {
					// при выборе другого города карта будет обновляться
					map.mapSetCenter(map, selectedCityBeg.getObject().getCoordinateLat(), selectedCityBeg.getObject().getCoordinateLng());
					userOrder.setCargoBeginningCity(selectedCityBeg.getObject());			
				}			
	        });
		dropDownChoiceBeginningCity.setLabel(new ResourceModel("p.home.createorder.cargoBeginSity"));
		dropDownChoiceBeginningCity.setOutputMarkupId(true);
		formCreateOrder.add(dropDownChoiceBeginningCity);
		
		// поле с начальной координатой
		final TextField<String> textFieldBeginPoint = new TextField<String>("cargoBeginningCoordinate");
		textFieldBeginPoint.add(new PropertyValidator<String>());		
		textFieldBeginPoint.setOutputMarkupId(true); 
		formCreateOrder.add(textFieldBeginPoint);
		
		// комбик с городами
		final Model<City> selectedCityFinal = new Model<City>();	
		final DropDownChoice<City> dropDownChoiceFinalCity = new DropDownChoice<City>("cargoFinalCity",selectedCityFinal, allCity, CityChoiseRenderer.INSTANCE);
		dropDownChoiceFinalCity.setRequired(true);
		if (userOrder.getCargoBeginningCity()!=null){
			dropDownChoiceFinalCity.setDefaultModelObject(userOrder.getCargoFinalCity());
		}
		dropDownChoiceFinalCity.add(new AjaxFormComponentUpdatingBehavior("change")
	        {
	
				@Override
				protected void onUpdate(AjaxRequestTarget target) {	
					// при выборе другого города карта будет обновляться
					map.mapSetCenter(map, selectedCityFinal.getObject().getCoordinateLat(), selectedCityFinal.getObject().getCoordinateLng());			
					userOrder.setCargoFinalCity(selectedCityFinal.getObject());		
				}      
	        });
		
		formCreateOrder.add(dropDownChoiceFinalCity);
		dropDownChoiceFinalCity.setLabel(new ResourceModel("p.home.createorder.cargoFinalSity"));
		dropDownChoiceFinalCity.setOutputMarkupId(true);
		
		// поле с конечной координатой
		final TextField<String> textFieldFinalPoint = new TextField<String>("cargoFinalCoordinate");
		textFieldFinalPoint.add(new PropertyValidator<String>());
		textFieldFinalPoint.setOutputMarkupId(true); 
		formCreateOrder.add(textFieldFinalPoint);
		
		final TextArea<String> cargoAnyDescr = new TextArea<String>("anyDescription");			
		cargoAnyDescr.setLabel(new ResourceModel("p.home.createorder.cargoAnyDescr"));
		formCreateOrder.add(cargoAnyDescr);

		
		// ссылка для очистки введеных координат и удалении точки на карте
		formCreateOrder.add(new AjaxFallbackLink("clearBeginPoint"){
			 @Override
			public void onClick(AjaxRequestTarget target) {
				 // если поле пустое то удлять не надо т.к. падает nullpoint				 
				 if (textFieldBeginPoint.getValue()=="" ||
						 textFieldBeginPoint.equals(null) )
				 {
				 }else{				 
					 textFieldBeginPoint.setDefaultModel(Model.of(""));
					 map.removeOverlay(map.gMakerBeggin);		
					 target.add(textFieldBeginPoint);
				 }
			 	}	
			});
		
		// ссылка для очистки введеных координат и удалении точки на карте			
		formCreateOrder.add(new AjaxFallbackLink("clearFinalPoint"){
		 @Override
		public void onClick(AjaxRequestTarget target) {
			 // если поле пустое то удлять не надо т.к. падает nullpoint
			 if (textFieldFinalPoint.getValue()=="" ||
					 textFieldFinalPoint.equals(null) )
			 {
			 }else{	
				 textFieldFinalPoint.setDefaultModel(Model.of(""));
				 map.removeOverlay(map.gMakerFinal);
				 target.add(textFieldFinalPoint);
			 }
		 	}	
		});

		formCreateOrder.add(new SubmitLink("sumbit-Formlink") {
			@Override
			/*
			 * при сабмите формы сохраняются координаты, и Id пользователя сделавшего заказ
			 * 
			 */
			public void onSubmit() {
				super.onSubmit();
				userOrder.setUser(user);
				userOrder.setCargoBeginningCoordinate(textFieldBeginPoint.getModelObject().toString());
				userOrder.setCargoFinalCoordinate(textFieldFinalPoint.getModelObject().toString());
				userOrderService.saveOrUpdate(userOrder);	
				HomePage homePage = new HomePage();
				homePage.info(new ResourceModel("p.home.createorder.createOrder").getObject());
				LOGGER.info(user.getLogin() + " create new Order, orderId" + userOrder.getId());
				setResponsePage(homePage);
			}
		});
		
		add(formCreateOrder);
		
		// слушатель событий нажатия кнопки на карте
		map.add(new ClickListener()
        {
            @Override
            protected void onClick(AjaxRequestTarget target, GLatLng latLng)
            {
                if (latLng != null)
                {               	  
                	/* если первое поле для ввода координат пустое, то добавляются в него координаты
                	 * и ставится марке на карте, если первое поле заполнено, то проверяется второе
                	 * поле для ввода координат (textFieldFinalPoint), если и она заполненно
                	 * то марке на карту нанесен не будет
                	 * */
					if (textFieldBeginPoint.getDefaultModelObjectAsString()==null || 
							textFieldBeginPoint.getDefaultModelObjectAsString().isEmpty()) {
						map.gOptions.setLatLng(latLng);
						map.addOverlay(map.gMakerBeggin);
						textFieldBeginPoint.setDefaultModel(Model.of(map.prepareCoordinat(latLng)));
						LOGGER.info(user.getLogin() + " - create BeginPoint :" + latLng.toString());
						target.add(textFieldBeginPoint);
					}else if (textFieldFinalPoint.getDefaultModelObjectAsString()==null || 
							textFieldFinalPoint.getDefaultModelObjectAsString().isEmpty()){
						map.gOptions.setLatLng(latLng);
						map.addOverlay(map.gMakerFinal);
						textFieldFinalPoint.setDefaultModel(Model.of(map.prepareCoordinat(latLng)));
						LOGGER.info(user.getLogin() + " - create FinalPoint :" + latLng.toString());
						target.add(textFieldFinalPoint);
					}
                }
            }
        });		
		}

	}
	


